package 反转链表;

import 其他.DataStructure.ListNode;
import org.junit.Test;

import static MyUtils.MHUtils.*;

/*
    做完题一定写入表格

    47/62 -> 剩下边界问题+dm，不做了
*/
public class c_k个一组反转链表 {

    //工具：反转左右为null切好的链表
    public ListNode fanzhuan_2bianqiehaoweinull(ListNode h) {
        ListNode fir = h;
        if(h==null){
            return null;
        }
        ListNode sec = h.next;
        if(h.next==null){
            return h;
        }
        while(sec!=null){
            ListNode tmp = sec.next;
            sec.next = fir;
            fir=sec; sec=tmp;
        }
        h.next = null;
        return fir;
    }
    int k;
    public ListNode reverseKGroup(ListNode h, int k) {
        ListNode t = h;
        //1-2-3 走2次 0~1(3-2)
        for (int i = 0; i <=k-2; i++) {
            t=t.next;
            //不足1：k-2个
            if(t==null && i<k-2){
                ListNode newH = fanzhuan_2bianqiehaoweinull(h);
                return newH;
            }
        }
        //不足2：k-1个
        if(t==null){
            ListNode newH = fanzhuan_2bianqiehaoweinull(h);
            return newH;
        }
        if(t.next!=null) {
            ListNode shouldRight = reverseKGroup(t.next, k);
            t.next=null;
            //用shouldRight不用反转的头，因为10->11反转后画成11->10
            ListNode newH = fanzhuan_2bianqiehaoweinull(h);
            h.next = shouldRight;
            return t;
        }

        //这个null没用，上面t=null有用处理剩的
        return null;
    }


    @Test
    public void test() {
        ListNode h = lizi_lianbiao("1 2 3 4 5 6 7 8 9 10 11");
        ListNode newH = reverseKGroup(h, 3);
        ptLianBiao(newH);
    }
}
